from selenium import webdriver
from time import sleep
import time
import pymysql
from smtplib import SMTP
from email.header import Header
from email.mime.text import MIMEText

# 报名结束时间    <   当前时间
# 已经过了报名时间，进行删除操作
def mysql_del():
    print("进行  ", time_now(), "时间删除操作")
    del_sql = "delete from data where start_time < '%s'" % time_now()
    cursor.execute(del_sql)
    db.commit()
    return 0


# 获取当前系统时间，并改为合适的格式
def time_now():
    time_now_detail = time.strftime("%Y-%m-%d") + ' ' + time.strftime("%H:%M")
    return time_now_detail


# 进行网页的爬取，并返回获取到的所有活动的数据
def web_get(uid,pwd):
    option = webdriver.ChromeOptions()
    option.add_argument('headless')
    bor = webdriver.Opera(options=option)
    bor.get('http://dekt.jiangnan.edu.cn/admin/index.html#/biz/activity/activityCenter')
    sleep(3)
    # 用户名
    inp = bor.find_elements_by_xpath('//div[@id="loginTypeWay"]/div[3]/div/input')
    while not inp:
        # bor.close()
        bor.get('http://dekt.jiangnan.edu.cn/admin/index.html#/biz/activity/activityCenter')
        inp = bor.find_elements_by_xpath('//div[@id="loginTypeWay"]/div[3]/div/input')
    inp[0].send_keys(uid)##此处用户名
    # 密码
    pwd = bor.find_elements_by_xpath('//div[@id="loginTypeWay"]/div[4]/div/input')
    while not inp:
        pwd = bor.find_elements_by_xpath('//div[@id="loginTypeWay"]/div[4]/div/input')
    pwd[0].send_keys(pwd)##此处密码
    # 点击按钮
    bor.find_elements_by_xpath('//div[@id="loginTypeWay"]/div[5]/div//input')[0].click()
    sleep(5)
    # 当加载好之后才进行点击”活动“按钮
    result = bor.find_elements_by_xpath('//aside[@class="site-sidebar site-sidebar--dark"]/div/ul/li[2]')
    while not result:
        result = bor.find_elements_by_xpath('//aside[@class="site-sidebar site-sidebar--dark"]/div/ul/li[2]')
    result[0].click()
    sleep(5)
    # 点击”活动中心“
    result = bor.find_elements_by_xpath('//aside[@class="site-sidebar site-sidebar--dark"]/div/ul/li[2]/ul/li[1]')
    while not result:
        result = bor.find_elements_by_xpath('//aside[@class="site-sidebar site-sidebar--dark"]/div/ul/li[2]/'
                                            'ul/li[1]')
    result[0].click()
    # 点击招募中
    # 有两个伪装div不需要考虑
    sleep(5)
    result3 = bor.find_elements_by_xpath('//main/div/div[1]/div/div/div[2]/div')  # 莫名其妙需要添加的东西
    result = bor.find_elements_by_xpath('//main/div/div[1]/div/div/div[2]/div/div[1]/label[2]')
    while not result:
        result = bor.find_elements_by_xpath('//main/div/div[1]/div/div/div[2]/div/div[1]/label[2]')
    result[0].click()
    # 等待响应后进行每一行的读取，获取并返回所有活动
    sleep(5)
    row_fir = bor.find_elements_by_xpath('//main/div/div[1]/div/div/div[2]/div/div[2]/div[3]/table/tbody/tr')
    while not row_fir:
        row_fir = bor.find_elements_by_xpath('//main/div/div[1]/div/div/div[2]/div/div[2]/div[3]/table/tbody/tr')
    return row_fir


# 邮件发送函数
'''
'发送人名称', '发送人邮箱', '接受者名称', '接受者邮箱', '文本(第二课堂标题)', '情况-断开、执行、新发布、空名额', '详细信息', 'qq邮箱smtp授权码'
'''
def email(send_person, sender_email, receiver, receiver_email,situation, notice_text, detail_text,code):
    # 请自行修改下面的邮件发送者和接收者
    message = MIMEText('第二课堂：\n'+notice_text+'\n'+situation+'请抓紧时间报名\n\n\n详细信息：\n\n\n'+detail_text,
                       _subtype='plain', _charset='utf-8')
    message['From'] = Header(send_person, 'utf-8')  # 邮件的发送者
    message['To'] = Header(receiver, 'utf-8')   # 邮件的接收者
    message['Subject'] = Header('第二课堂', 'utf-8') # 邮件的标题s
    smtper = SMTP('smtp.qq.com')
    # 请自行修改下面的登录口令
    smtper.login(sender_email, code)  # QQ邮箱smtp的授权码
    smtper.sendmail(sender_email, receiver_email, message.as_string())
    print('邮件发送完成!')


def getfromsql():
    cursor = db.cursor()
    sql = "select * from user_login"
    cursor.execute(sql)  # 执行数据库语句
    a = list(cursor.fetchall())
    email_all = []
    for b in a:
        email_all.append(b[1])
    return email_all

# 对获取到的所有活动数据进行操作
# 执行每一个具体的活动信息所执行的操作
# 返回新增数量
def second_class(second_class_row):
    test_bug = 0
    now = time_now()
    # second_class_row代表返回的所有活动

    # 循环对每一个活动进行判断
    # i代表每一个具体的活动
    for i in second_class_row:

        # detail代表每一个活动的所有详细信息，将detail数据封装到active中
        active = []
        detail = i.find_elements_by_xpath('./td')

        # 进行每一行中的每一个详细细节的读取
        # j代表每一个活动的每一个详细信息（名称/地点/报名结束时间等）
        # 将每个数据纳入到active中
        for j in detail:
            text = j.find_elements_by_xpath('./div')
            active.append(text[0].text)

        # 查询数据库中有没有爬取到的信息
        select = "select * from data where active_name = '%s'" % (active[0])

        # 数据库中如果不存在则执行插入功能，并发送短信
        # 数据库中不存在 + 报名结束时间＞当前时间（未存库且未结束）————发短信存库/只进行存库
        detail_sql = ''
        if not db.query(select) and active[2] > now and int(active[6]) > 0:
            # 招募人数>报名人数（有余额）————发短信
            if int(active[5]) > int(active[6]):
                test_bug += 1
                print("第二课堂：" + active[0] + "已经发布了，快去抢他")
                data_text = '活动名称：' + active[0] + '\n' + '活动地点：' + active[4] + '\n' + '报名结束时间：' + active[2] + '\n' + \
                            '活动开始时间：' + active[3] + '\n' + '活动学时：' + active[7] + '\n' + '总人数：' + active[5] + '\n' + \
                            '已报名人数：' + active[6]
                email('发送人名称','发送人邮箱','接受者名称',getfromsql(),active[0],'情况-断开、执行、新发布、空名额',data_text,'qq邮箱smtp授权码')

            detail_sql = "INSERT INTO data " \
                         "(active_name, start_time, finish_time, place, required_numb," \
                         " had_numb, class_hour, latest_updata)" \
                         "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % \
                         (active[0], active[2], active[3], active[4], active[5], active[6], active[7], now)

        # 数据库中存在  + 报名结束时间>当前时间（存库且未结束）————更新操作
        elif db.query(select) and active[2] > now and int(active[6]) > 0:
            detail_sql = "update data set had_numb='%s',latest_updata='%s' where active_name ='%s'" \
                         % (active[6], now, active[0])
            if int(active[5]) > int(active[6]):
                data_text = '活动名称：' + active[0] + '\n' + '活动地点：' + active[4] + '\n' + '报名结束时间：' + active[2] + '\n' + \
                            '活动开始时间：' + active[3] + '\n' + '活动学时：' + active[7] + '\n' + '总人数：' + active[5] + '\n' + \
                            '已报名人数：' + active[6]
                #'发送人名称', '发送人邮箱', '接受者名称', '接受者邮箱', '文本(第二课堂标题)', '情况-断开、执行、新发布、空名额', '详细信息', 'qq邮箱smtp授权码'
                email('发送人名称','发送人邮箱','接受者名称',getfromsql(),active[0],'情况-断开、执行、新发布、空名额',data_text,'qq邮箱smtp授权码')

        print("语句", detail_sql)

        if detail_sql != '':
            cursor.execute(detail_sql)
        # else:
        #     if cursor.execute(detail_sql):
        #         k = 0
    # 输出新发布的数据数量
    print(test_bug, "个活动发布")
    return 0


if __name__ == '__main__':
    try:
        db = pymysql.connect(host="localhost", port=3308, user="root", password="zzyy0223", database="second_class",
                             charset='utf8')
        cursor = db.cursor()
        n = 0
        mysql_del()
        while 1:
            n = n+1
            print("第", n, "次执行")
            second_class(web_get('',''))
            # 每50分钟发一条消息，来确认正在执行，并删除过期信息
            if n % 20 == 0:
                email('发送人名称', '发送人邮箱', '接受者名称', '接受者邮箱', '文本(第二课堂标题)', '正在执行', '详细信息', 'qq邮箱smtp授权码')
                # 将过期的进行删除
                mysql_del()
            db.commit()
            sleep(120)
    finally:
        email('发送人名称', '发送人邮箱', '接受者名称', '接受者邮箱', '文本(第二课堂标题)', '已断开', '详细信息', 'qq邮箱smtp授权码')
